#ifndef RED_SOCIAL_H
#define RED_SOCIAL_H
//
#include "Mensaje.h"
#include "ListaOrd.h"
#include "MatrizRestricciones.h"
#include "DiccTrie.h"
#include "InfoUsuario.h"

class RedSocial
{
	public:

		RedSocial(Reglas* r) : reglas(MatrizRestricciones(r)) {};
		~RedSocial();
		void registrar(Usuario u, Pais p);
		void publicar(Mensaje* m);
		void quererSerAmigo(Usuario u1, Usuario u2);
		const bool sonAmigos(const Usuario u1, const Usuario u2) const;
		const bool quiereSerAmigo(const Usuario u1, const Usuario u2) const;
		const ListaOrd::ItListaOrd mensajesVisibles(Usuario u) const;
		const ListaOrd::ItListaTemp mensajesVisiblesRecientes(Usuario u) const;
		aed2::Nat repeticionesRecientesTag(Tag t);
		void contabilizarTag(Tag t);
		Fecha fechaActual();

		class ItListaTags
		{
            public:

                ItListaTags();
                ItListaTags(RedSocial& rs);
                bool hayMas() const;
                const Tag actual() const;
                void avanzar();

            private:

                ItUniLista<Tag> it;
				RedSocial* crs;
		};
		ItListaTags CrearItTags();
		ItListaTags tagsRecientes();

	private:

		MatrizRestricciones reglas;
		DiccTrie<InfoUsuario> usuarios;
		ListaOrd mensajes;
		struct Sig
		{
			aed2::Nat reps;
			Fecha fecha;
		};
		struct Tags
		{
			DiccTrie< Arreglo<Sig> > dicc;
			Lista<Tag> claves;
		};
		Tags tags;
};

#endif
